/*
create by 崔磊. 2015-12-05
此脚本作为项目发布前的辅助脚本，
作用在于在项目模块build之前将开发环境和部署环境中不同的文件替换掉，
通常它们是一些带有ip和数据库连接信息的配置文件。
在maven构建的项目中，它往往应该在最终的 mvn package 命令之前被执行:
groovy ready_build.groovy
它有两种用法：
一.按照相同目录结构替换
假若放置文件a.txt到.dist/dep_files/a.txt的位置
-------执行之前---------
.dist/
    -dep_files/
        -a.txt
.git
-----------------------
-------执行之后---------
.dist/
    -dep_files/
        -a.txt
.git
a.txt
-----------------------
当然最终目的是嵌套的目录结构，假若在.dist/dep_files/创建根目录中的同名目录.git并且放置a.txt文件，.dist/dep_files/.git/a.txt
-------执行之前---------
.dist/
    -dep_files/
        -.git/
            -a.txt
.git
-----------------------
-------执行之后---------
.dist/
    -dep_files/
        -.git/
            -a.txt
.git/
    -a.txt
-----------------------
以上的用途很明了，以".dist/dep_files/"作为根，创建什么结构的目录（无论多少层级），最终所有文件会被复制到项目根目录"/"以下的指定位置。

二.自定义文件配置路径
.dist目录下创建一个dep_resources.json文件，定义一个JSON数组，EXAMPLE:
[
  {
    "sourceFile": ".dist/dep_resources/.gitignore",
    "targetFile": ".gitignore"
  }
]
上面JSON对象中的sourceFile表示源文件路径，targetFile表示目标文件路径，源文件会替换目标文件（目标文件的存在不是必须的）。

上述两种情况可以同时存在，会首先执行dep_resources.json中的文件复制，然后是.dist/dep_files/下的文件复制。

注意：
如果指定的目标文件所在的目录结构中任意一个层级的目录不存在，
目录不会被创建，文件也不会被复制，会认为这是一个错误，并在日志中输出。

*/

import groovy.io.FileType
import groovy.json.JsonSlurper
import java.nio.file.Files
import java.nio.file.NoSuchFileException
import java.nio.file.Paths

//读取JSON文件
def json = new File(".dist/dep_resources.json").getText("UTF-8")
def jsonSlurper = new JsonSlurper()
def list = jsonSlurper.parseText(json)
errorTotal = 0

//替换dep.resources.json中定义的文件
list.each {
    copyList(it["sourceFile"] as String, it["targetFile"] as String)
}
//替换deo_resources目录中的文件
def dir = new File(".dist/dep_files")
dir.traverse(type: FileType.FILES) {
    def curPath = it as String
    def targetPath = Paths.get(curPath).subpath(2, Paths.get(curPath).getNameCount()) as String
    copyList(curPath, targetPath)
}
if (errorTotal == 0)
    println "SUCCESS."
else
    println "Error:" + errorTotal + "(COUNT)"

def copyList(String sourcePath, String targetPath) {
    printf sourcePath + " >>> " + targetPath
    def sourceFile = Paths.get(sourcePath)
    def targetFile = Paths.get(targetPath)
    try {
        if (Files.exists(targetFile))
            Files.delete(targetFile)
    } catch (Exception e) {
        println "目标文件删除失败." + e.getMessage()
    }
    try {
        Files.copy(sourceFile, targetFile)
        println ""
    } catch (NoSuchFileException exception) {
        println ",出错：源文件或者目录不存在。"
        errorTotal++
    }
}

/*
Groovy 是一个类似Ruby的脚本语言，但它可以执行在JVM上。
*/